package com.htsk.city.services.core.utils;

public class GeoUtils {
    /**
     * 地球平均半径，单位：千米
     */
    public static final double EARTH_RADIUS_KM = 6371.0;
    /**
     * 地球平均半径，单位：英里
     */
    public static final double EARTH_RADIUS_MI = 3956.0;

    /**
     * 使用Haversine公式计算两个经纬度坐标之间的距离
     *
     * @param lat1 第一个点的纬度
     * @param lon1 第一个点的经度
     * @param lat2 第二个点的纬度
     * @param lon2 第二个点的经度
     * @param unit 单位，'K' 代表公里（默认），'M' 代表英里，'N' 代表海里
     * @return 两点之间的距离（单位取决于参数）
     */
    public static double calculateDistance(double lat1, double lon1, double lat2, double lon2, char unit) {
        // 将十进制度数转换为弧度
        double lat1Rad = Math.toRadians(lat1);
        double lon1Rad = Math.toRadians(lon1);
        double lat2Rad = Math.toRadians(lat2);
        double lon2Rad = Math.toRadians(lon2);

        // 经纬度的差值
        double deltaLat = lat2Rad - lat1Rad;
        double deltaLon = lon2Rad - lon1Rad;

        // Haversine公式计算中心角a
        double a = Math.pow(Math.sin(deltaLat / 2), 2)
                + Math.cos(lat1Rad) * Math.cos(lat2Rad)
                * Math.pow(Math.sin(deltaLon / 2), 2);

        // 计算角距离
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));

        // 根据单位选择返回距离
        switch (unit) {
            case 'M': // 英里
                return c * EARTH_RADIUS_MI;
            case 'N': // 海里
                return c * (EARTH_RADIUS_KM * 0.5399568); // 1公里 = 0.5399568海里
            case 'K': // 公里
            default:
                return c * EARTH_RADIUS_KM;
        }
    }

    /**
     * 重载方法，默认单位为公里
     */
    public static double calculateDistance(double lat1, double lon1, double lat2, double lon2) {
        return calculateDistance(lat1, lon1, lat2, lon2, 'K');
    }
}
